package hos.http;

import android.content.Context;
import android.os.SystemClock;
import android.text.format.DateUtils;
import android.text.format.Formatter;

import java.util.Objects;

/**
 * <p>Title: Progress </p>
 * <p>Description: 下载/上传进度信息 </p>
 * <p>Company: www.mapuni.com </p>
 *
 * @author : 蔡俊峰
 * @version : 1.0
 * @date : 2023-02-24 18:15
 */
public class Progress {

    /**
     * 当前已经完成的字节数
     */
    public Long currentByteCount = 0L;

    /**
     * 全部字节数
     */
    public Long totalByteCount = 0L;

    /**
     * 距离上次进度变化的新增字节数
     */
    public Long intervalByteCount = 0L;

    /**
     * 距离上次进度变化的时间
     */
    public Long intervalTime = 0L;

    /**
     * 是否完成
     */
    public Boolean finish = false;

    /**
     * 开始下载的时间
     */
    public Long startElapsedRealtime = SystemClock.elapsedRealtime();

    /**
     * 每秒下载速度, 字节单位
     */
    public Long speedBytes = 0L;

    public Long getSpeedBytes() {
        if (intervalTime <= 0L || intervalByteCount <= 0) {
            return speedBytes;
        } else {
            speedBytes = intervalByteCount * 1000 / intervalTime;
            return speedBytes;
        }
    }

    @Override
    public String toString() {
        return "Progress(currentByteCount=" + currentByteCount + ", totalByteCount=" + totalByteCount + ", finish=" + finish + ")";
    }

    /**
     * 文件全部大小
     * 根据字节数自动显示内存单位, 例如 19MB 或者 27KB
     */
    public String totalSize(Context context) {
        long totalBytes = (totalByteCount <= 0) ? 0 : totalByteCount;
        return Formatter.formatFileSize(context, totalBytes);
    }

    /**
     * 已完成文件大小
     * 根据字节数自动显示内存单位, 例如 19MB 或者 27KB
     */
    public String currentSize(Context context) {
        return Formatter.formatFileSize(context, currentByteCount);
    }

    /**
     * 剩余大小
     * 根据字节数自动显示内存单位, 例如 19MB 或者 27KB
     */
    public String remainSize(Context context) {
        long remain = (totalByteCount <= 0) ? 0 : totalByteCount - currentByteCount;
        return Formatter.formatFileSize(context, remain);
    }


    /**
     * 每秒下载速度
     * 根据字节数自动显示内存单位, 例如 19MB 或者 27KB
     */
    public String speedSize(Context context) {
        return Formatter.formatFileSize(context, speedBytes);
    }

    /**
     * 请求或者响应的进度, 值范围在0-100
     * 如果服务器返回的响应体没有包含Content-Length(比如启用gzip压缩后Content-Length会被删除), 则无法计算进度, 始终返回0
     */
    public int progress() {
        if (finish || Objects.equals(currentByteCount, totalByteCount)) {
            return 100;
        }
        if (totalByteCount <= 0) {
            return 0;
        }
        return (int) (currentByteCount * 100 / totalByteCount);
    }

    /**
     * 已使用时间
     */
    public String useTime() {
        return DateUtils.formatElapsedTime((SystemClock.elapsedRealtime() - startElapsedRealtime) / 1000);
    }

    /**
     * 已使用时间
     *
     * @return 秒
     */
    public long useTimeSeconds() {
        return (SystemClock.elapsedRealtime() - startElapsedRealtime) / 1000;
    }

    /**
     * 剩余时间
     */
    public String remainTime() {
        long remainSeconds;
        if (totalByteCount <= 0 || speedBytes <= 0L) {
            remainSeconds = 0L;
        } else {
            remainSeconds = (totalByteCount - currentByteCount) / speedBytes;
        }
        return DateUtils.formatElapsedTime(remainSeconds);
    }

    /**
     * 剩余时间
     *
     * @return 秒
     */
    public Long remainTimeSeconds() {
        long remainSeconds;
        if (totalByteCount <= 0 || speedBytes <= 0L) {
            remainSeconds = 0L;
        } else {
            remainSeconds = (totalByteCount - currentByteCount) / speedBytes;
        }
        return remainSeconds;
    }
}
